home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / graphics / raymovi2.arc / MOVIE.C < prev    next >
C/C++ Source or Header  |  1988-12-21  |  2KB  |  82 lines

  1. /* movie.c        inertia, gravity, bouncing */
  2.  
  3. #include "rtd.h"
  4. #include <math.h>
  5.  
  6. double dot();
  7. float tx43;
  8. #define cube(a) ((tx43=a)*(tx43)*(tx43))
  9. #define density 1.0
  10.  
  11. movie(bl, nob, step, Step, gravity, bounce, attraction)
  12. struct ball *bl;
  13. int nob, step, Step, bounce;
  14. float gravity, attraction;
  15. {    register int i, j;
  16.     register struct ball *bli, *blj;
  17.     struct vector f;
  18.     for (step = 0; step<Step; step++)
  19.     {    for (i=0, bli=bl; i<nob; i++, bli++)
  20.         {    if (bounce) for (j=i+1, blj=bli+1; j<nob; j++, blj++)
  21.             {    register float 
  22.                       massi, massj, /* mass of balls (i&j) */
  23.                       fi, fj,        /* mass fraction (i&j) */
  24.                       tmp;
  25.                 struct vector cmv,  /* center mass velocity*/
  26.                        rvi, rvj,    /* relative vel (i&j)  */
  27.                        d;        /* distance between i&j*/
  28.                 sv(&d, &bli->s.cent, &blj->s.cent);
  29.                 vecl(&d);
  30.                 if (d.l <= bli->s.rad + blj->s.rad)
  31.                 {    tmp = bli->s.rad; massi = tmp*tmp*tmp;
  32.                     tmp = blj->s.rad; massj = tmp*tmp*tmp;
  33.                     fi = massi/(massi+massj);
  34.                     fj = massj/(massi+massj);
  35.                     cmv.x = fi*bli->v.x + fj*blj->v.x;
  36.                     cmv.y = fi*bli->v.y + fj*blj->v.y;
  37.                     cmv.z = fi*bli->v.z + fj*blj->v.z;
  38.  
  39.                       /*    rvi = bli->v - cmv      */
  40.                     sv(&rvi, &bli->v, &cmv);
  41.                     tmp = dot(&d,&rvi);
  42.                       /*    d = 2*|d.rvi|/|d.d|*d   */    
  43.                     scamult(2.0*tmp/(d.l*d.l),&d);
  44.                       /*    bli->v = d - rvi + cmv  */    
  45.                     sv(&rvi, &rvi,&d);
  46.                     av(&bli->v, &cmv, &rvi);
  47.  
  48.                     vecl(&d);
  49.                     sv(&rvj, &blj->v, &cmv);
  50.                     tmp = dot(&d,&rvj);
  51.                     scamult(2.0*tmp/(d.l*d.l),&d);
  52.                     sv(&rvj, &rvj,&d);
  53.                     av(&blj->v, &cmv, &rvj);
  54.             }    }
  55.             if (attraction != 0.0) 
  56.             {    register float dl, tmp;
  57.                 struct vector d;
  58.                 f.x = f.y = f.z = 0.0;
  59.                 for (j=0, blj=bl; j<nob; j++, blj++) if (i != j)
  60.                 {
  61.                     sv(&d, &bli->s.cent, &blj->s.cent);
  62.                     dl = sqrt(d.x*d.x + d.y*d.y + d.z*d.z);
  63.                     tmp = blj->s.rad/dl; tmp=tmp*tmp*tmp;
  64.                     scamult(tmp, &d); /* mass/(r*r) */
  65.                     av(&f, &f, &d);
  66.                 }
  67.                 scamult(attraction/(density*Step), &f);
  68.                 sv(&bli->v,  &bli->v, &f);
  69.         }    }
  70.         for (i=0, bli=bl; i<nob; i++, bli++)
  71.         {    bli->s.cent.x += bli->v.x/Step;
  72.  
  73.             bli->v.y -= gravity;
  74.             bli->s.cent.y += bli->v.y/Step;
  75.             if (bli->s.cent.y < bli->s.rad && bli->v.y < 0)
  76.                 bli->v.y = - bli->v.y;
  77.  
  78.             bli->s.cent.z += bli->v.z/Step;
  79.             if (bli->s.cent.z < bli->s.rad && bli->v.z < 0)
  80.                 bli->v.z = - bli->v.z;
  81. }    }    }
  82.